Snowflake Reader Accountの利用方法 ~Snowflake契約がないクライアントとデータを共有する~
データアナリティクス事業本部コンサルティングチームのnkhrです。
Snowflakeアカウントを持たないクライアント(グループ会社や取引先など)とデータを共有するために利用できる、Reader Accountについてまとめました。本ブログでは、Reader Accountを作成し、データ共有を行うまでの手順を記載しています。
目次
Reader Accountの概要
Reader Accountを利用することで、Snowflakeの新規契約を行わずにデータ共有用の新しいアカウントを作成できます。Reader Accountも通常のアカウントと同様に、デフォルトROLE(ACCOUNTADMINやSYSADMINなど)が提供されます。ただし、通常のアカウントとは違い、アカウント単位で以下の権限が利用不可です。(2021/10時点)
- INSERT
- UPDATE
- DELETE
- MERGE
- COPY INTO <テーブル>
- CREATE MASKING POLICY
- CREATE PIPE
- CREATE ROW ACCESS POLICY
- CREATE SHARE
- CREATE STAGE
Reader Accountにおいては、ACCOUNTADMINロールを利用しても上記のコマンドは実行できません。Roleやウェアハウスの作成は可能ですが、データのINSERTや、共有されたデータの編集ができないアカウントです。
// Reader Accountで内部ステージの作成(失敗確認) // 通常の運用ではACCOUNTADMINは利用しない方が良いです。検証のための利用です。 USE ROLE ACCOUNTADMIN; CREATE TRANSIENT DATABASE IF NOT EXISTS "TEST_DB"; USE DATABASE TEST_DB; //-- ここまでは実行可能 CREATE STAGE my_test_stage //-- CREATE STAGEコマンドはアカウント単位で許可されていないため失敗 COPY_OPTIONS = (ON_ERROR='skip_file');
Reader Account利用時の考慮点
- Reader AccountのCredit利用費は、アカウント作成元に請求されるため、リソースモニターによる制限を設定したほうが良いと思います。
- Reader Account別のCredit Usageは「READER_ACCOUNT_USAGE Views」から確認できます。
- Reader Accountは直接Supportに問い合わせができないため、Provider Account(Reader Accountの作成元)から問い合わせが必要です。
- Reader Accountはデフォルトで20アカウントまで作成できます(Supportに連絡することで制限緩和できます)。
データ操作権限が必要な別アカウントを作成する場合は、Organization機能が利用できます。Organizationsの概要および開始方法については、下記のブログを参照してください。
Reader Accountの作成
ACCOUNTADMINロールを利用して、Reader Accountします。「CREATE ACCOUNT グローバル権限」を他のROLEに付与することで、ACCOUNTADMIN以外のROLEでReader Accountの作成できます。通常の運用においては、ACCOUNTADMINロール以外に権限を委譲することをお勧めします。
CREATE ACCOUNT権限を別Roleに付与
USE ACCOUNTADMIN; GRANT CREATE ACCOUNT ON ACCOUNT TO ROLE <your-custome-role-or-other-default-role>;
Reader Accountの作成
USE ROLE ACCOUNTADMIN; // 通常の運用では、他のROLEに権限移譲したほうが良い CREATE MANAGED ACCOUNT reader_acct1 admin_name = "test_reader_admin" admin_password = "<reader-account-admin-password>" type = reader; // 作成したアカウントの確認 SHOW MANAGED ACCOUNTS LIKE 'reader_acc1';
Webインタフェースから実行する場合は、[Account] > [Reader Account] > [Create Reader Account]から実行できます。
Reader Accountへログイン
[Account] > [Reader Account]の画面にReader Accountの一覧が表示されるので、「Account URL」カラムに表示されたURLからReader Accountにログインします。URLは20秒程度で作成されますが、実際にログインできるようになるまでに少し時間がかかります(公式ドキュメントでは5分待つように記載があります)。URLアクセス時に「403Forbidden」と表示される場合は、時間をおいてからアクセスするとよいです。
ログイン時に下記画像のように、「データプロバイダー」か「データコンシューマー」を選択画面が表示されます。Reader Accountなのでデータコンシューマになるはずなので、「データコンシューマです」を選択すればよいと思います。公式ドキュメントには、選択の違いについての記載はありませんでした。実際の操作においてもどちらを選択した場合も、ログイン後の画面も違いはなさそうでした。(今後、この表示はなくなるかもしれません)
Reader Accountとのデータ共有設定
Provider Account設定
Provider Account (Reader Accountの作成元アカウント)で共有したい対象を設定します。Webインタフェースの「共有(Shares)」アイコンからGUI操作で設定することもできます。OUTBOUNDがデータ提供元(Provider Account)の共有設定です。
- 共有対象のオブジェクトを設定するための空の共有(test_s)を作成
USE ROLE ACCOUNTADMIN; GRANT CREATE SHARE ON ACCOUNT TO SYSADMIN; // 共有設定の権限をSYSADMINに付与(他のROLEでもよい) USE ROLE SYSADMIN; CREATE SHARE test_s; // 空の共有(share)を作成
-
共有したい対象テーブル(table_a)へのSELECT許可を設定
※テーブルへの操作権限を許可する場合は、テーブルが所属するSchemaとDatabaseへのUSAGE権限も必要です。
USE ROLE SYSADMIN; // 手順1で実行権限を付与済み GRANT USAGE ON DATABASE a_db TO SHARE test_s; // DATABASEのUSAGE権限を追加 GRANT USAGE ON SCHEMA a_db.a_schema TO SHARE test_s; GRANT SELECT ON TABLE a_db.a_schema.table_a TO SHARE test_s; // test_s共有へ付与した権限を表示 SHOW GRANTS TO SHARE test_s;
-
作成したReader Accountへの共有設定
ALTER SHARE test_s ADD ACCOUNTS=<Reader Account Locator>; // toカラムに共有先のアカウントLocatorが表示されていることが確認できる SHOW SHARES LIKE 'test_s';
- LocatorはReader Account一覧の「Locator」カラムの値またはコマンド
SHOW managed accounts;
で確認可能 - 複数アカウントと共有する場合はカンマ区切りで複数指定する
ACCOUNTS= <account1>, <account2>;
Business Criticalのアカウントのデータ共有の場合、デフォルトで共有が制限されている場合があります。Business Criticalでのデータ共有やデータ共有制限の解除については、Data Sharing and Business Critical Accountsを参照してください。
Consumer Account(Reader Account)設定
作成したReader Account(データのコンシューマ)側での設定を記載します。Reader Accountの作成直後はACCOUNTADMIN権限を持つユーザが1つ存在するだけなので、適切なRoleやユーザを作成します。
- Custom Roleの作成
アカウント作成後は、デフォルトROLE(ACCOUNTADMIN, SECURITYADMIN, SYSADMIN, USERADMIN)が存在します。デフォルトROLE以外のROLEが必要な場合は、CUSTOME ROLEを作成します。
USE ROLE USERADMIN; CREATE ROLE custome_reader_role; GRANT ROLE custome_reader_role TO ROLE sysadmin; // SYSADMINを親Roleに指定
-
Userの作成
USE ROLE USERADMIN; // ログインユーザ名はtest_readerになる CREATE USER IF NOT EXISTS test_reader DEFAULT_ROLE = custome_reader_role TIMEZONE = 'Asia/Tokyo' PASSWORD = '<password-of-test_reader>'; GRANT ROLE custome_reader_role TO USER test_reader; //Custom Roleの利用権限を付与
CREATAE USE
コマンドでLOGIN_NAME
を指定しない場合、ログインユーザ名はユーザ名と同名となります- SECURITYADMINロールを持つユーザを最低1名、SYSADMINロールを持つユーザを最低1名作ることが推奨されています
- Resource Monitorの作成
Reader AccountのCredit消費はProvider Accountに請求されるため、Resource MonitorによるCredit消費制限を行うとよいです。
CREATE RESOURCE MONITOR reader_accout_monthly_monitor WITH CREDIT_QUOTA = 1 // Creadit 1 FREQUENCY = MONTHLY //月ごとにCredit消費をクリア START_TIMESTAMP = IMMEDIATELY //作成時からモニタリング開始 TRIGGERS ON 100 PERCENT DO SUSPEND_IMMEDIATE //100%で実行中クエリも即座にすべて停止 ON 99 PERCENT DO SUSPEND //99%で実行中クエリは完了を待ち。その他クエリは実行停止 ON 90 PERCENT DO NOTIFY //90%で通知(ACCOUNTADMINの通知設定のメールアドレス連絡) ON 80 PERCENT DO NOTIFY ON 50 PERCENT DO NOTIFY;
1つのResource Monitorはアカウントレベルで設定できます。(ウェアハウスに紐づけなしでアカウント内のCredit消費をすべてモニターできる)。アカウントレベルで設定する場合は
ALTER ACCOUNT
コマンドを利用します。USE ROLE ACCOUNTADMIN; ALTER ACCOUNT SET RESOURCE_MONITOR = reader_accout_monthly_monitor; SHOW RESOURCE MONITORS; // levelカラムの値が「ACCOUNT」であれば、アカウントレベル設定
-
Warehouse作成とROLEへの権限付与
USE ROLE SYSADMIN; CREATE OR REPLACE WAREHOUSE reader_wh WITH warehouse_size='XSMALL' MAX_CLUSTER_COUNT=1 AUTO_SUSPEND=180 // 3分間実行がなければWH自動停止 AUTO_RESUME=TRUE // TRUEの場合はクエリ実行時に自動でWH起動 INITIALLY_SUSPENDED=TRUE // TRUEの場合はWH作成後は停止、FALSEの場合は作成後に起動; ; // WAREHOUSE利用、操作(一時停止や再開など)、利用状況の確認権限を付与、WHの変更は不可 GRANT USAGE,OPERATE,MONITOR ON WAREHOUSE reader_wh TO ROLE custome_reader_role;
-
Provider Accountの共有からDB作成
下記の
CREATE DATABASE
コマンドを実行することで、共有されているオブジェクトが利用できるようになります。// 共有からDatabaseを作成 CREATE DATABASE shared_db FROM SHARE <Provider Account Locator>.test_s; // CUSTOM ROLEに共有された権限を付与 GRANT IMPORTED PRIVILEGES ON DATABASE shared_db TO ROLE custome_reader_role; // 共有DBへの接続確認 USE ROLE SYSADMIN; USE WAREHOUSE reader_wh; SELECT * FROM shared_db.test_schema.test_a;
以上でProvider AccountでReader Account(Consumer)を作成し、Reader Accountで共有されたテーブルを確認することができました。
おわりに
今回は、Reader Accountの利用方法について記載しました。Reader AccountやOrganization機能を使うことで、新しい環境の構築とデータ共有がスピーディーにできそうです。